#include <iostream>
using std::cout;
using std::endl;

class CowString{
public:
    //浅拷贝：指针变量不去申请堆空间
    //而是和之前的指针变量一样指向同一块内存区域
    //所以此时，当前这块堆空间的引用数+1
    CowString(const CowString & rhs)
    :_pstr(rhs._pstr)
    {
        ++*(int *)(_pstr - 4);
    }

    //赋值运算符的浅拷贝形式
    //左操作数的引用计数 - 1之后如果等于0需要回收空间
    //进行浅拷贝，指向同一个堆空间
    //堆空间此时的引用计数 + 1
    CowString & operator=(const CowString & rhs){
        if(this != &rhs){
            if(--*(int *)(_pstr - 4) == 0){
                delete [] (_pstr - 4);
            }
            _pstr = rhs._pstr;
            ++*(int *)(_pstr - 4);
        }
        return *this;
    }

    //浅拷贝的析构函数
    //每当有一个CowString对象被销毁，那么意味着一个引用减少
    //如果引用减少到0了，那么需要执行回收堆空间的操作
    ~CowString(){
        if(--*(int *)(_pstr - 4) == 0){
            delete [] (_pstr - 4);
            _pstr = nullptr;
        }
    }


private:
    char * _pstr;
};


void test(){

}

int main()
{
    test();
    return 0;
}

